1. Taking apart the bitmap compression


[00BAD5] 7ad5 3E 13       LD A,13h         AF=0044 BC=00BE DE=3420 HL=B76D SP=DFEE IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=30000 [ROM]  3460
[00BAD7] 7ad7 32 FF FF    LD (FFFFh),A     AF=1344 BC=00BE DE=3420 HL=B76D SP=DFEE IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=30000 [ROM]  3460

...

; Rune selection

[00BAEC] 7aec 7E          LD A,(HL)        AF=4C1E BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAED] 7aed FE 01       CP 01h           AF=001E BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAEF] 7aef 28 12       JR Z,7B03h       AF=00BB BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAF1] 7af1 FE 02       CP 02h           AF=00BB BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAF3] 7af3 28 1C       JR Z,7B11h       AF=00BB BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480

; Decode bitmap

[00BAF5] 7af5 21 7F 95    LD HL,957Fh      AF=00BB BC=0880 DE=4480 HL=4C45 SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAF8] 7af8 11 87 A5    LD DE,A587h      AF=00BB BC=0880 DE=4480 HL=957F SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BAFB] 7afb CD 5D 7B    CALL 7B5Dh       AF=00BB BC=0880 DE=A587 HL=957F SP=DFEE IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480

[00BAFE] 7afe CD 78 7B    CALL 7B78h       AF=7D44 BC=0028 DE=3D4C HL=DBD0 SP=DFEE IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  3D34
[00BB01] 7b01 18 1A       JR 7B1Dh         AF=00BB BC=0028 DE=3D4C HL=7BE0 SP=DFEE IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  3D34

; __________________________________________________________

[00BB5D] 7b5d D5          PUSH DE          AF=00BB BC=0880 DE=A587 HL=957F SP=DFEC IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BB5E] 7b5e 11 00 20    LD DE,2000h      AF=00BB BC=0880 DE=A587 HL=957F SP=DFEA IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BB61] 7b61 CD 2A 07    CALL 072Ah       AF=00BB BC=0880 DE=2000 HL=957F SP=DFEA IX=C280 IY=C2B0 OB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00BB64] 7b64 E1          POP HL           AF=02BB BC=0440 DE=6CE0 HL=9A81 SP=DFEA IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  2CE0

...

; __________________________________________________________

; Save page 1

[00072A] 072a 3A FE FF    LD A,(FFFEh)     AF=0042 BC=0000 DE=0320 HL=875A SP=DFEC IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00072D] 072d F5          PUSH AF          AF=0242 BC=0000 DE=0320 HL=875A SP=DFEC IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320

; Load decoder page

[00072E] 072e 3E 02       LD A,02h         AF=0242 BC=0000 DE=0320 HL=875A SP=DFEA IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[000730] 0730 32 FE FF    LD (FFFEh),A     AF=0242 BC=0000 DE=0320 HL=875A SP=DFEA IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320

; Call bitmap decoder

[000733] 0733 CD 4E 40    CALL 404Eh       AF=0242 BC=0000 DE=0320 HL=875A SP=DFEA IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320

; Restore old page

[000736] 0736 F1          POP AF           AF=0044 BC=00BF DE=4363 HL=8785 SP=DFEA IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0360
[000737] 0737 32 FE FF    LD (FFFEh),A     AF=0242 BC=00BF DE=4363 HL=8785 SP=DFEC IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0360
[00073A] 073a C9          RET              AF=0242 BC=00BF DE=4363 HL=8785 SP=DFEC IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0360

; __________________________________________________________

[00804E] 404e C3 72 71    JP 7172h         AF=0242 BC=0000 DE=0320 HL=875A SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320

; Path selection

[00B172] 7172 CB F2       SET 6,D          AF=0242 BC=0000 DE=0320 HL=875A SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00B174] 7174 0E BF       LD C,BFh         AF=0242 BC=0000 DE=4320 HL=875A SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00B176] 7176 7E          LD A,(HL)        AF=0242 BC=00BF DE=4320 HL=875A SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00B177] 7177 23          INC HL           AF=0042 BC=00BF DE=4320 HL=875A SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00B178] 7178 B7          OR A             AF=0042 BC=00BF DE=4320 HL=875B SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320
[00B179] 7179 20 3B       JR NZ,71B6h      AF=0044 BC=00BF DE=4320 HL=875B SP=DFE8 IX=FFFF IY=FFFF B    P0=00000 P1=08000 P2=54000 [ROM]  0320

; ------------------------------------------------------------

; VRAM pointer

[00B1B6] 71b6 F3          DI               AF=0100 BC=00BF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  3460
[00B1B7] 71b7 ED 59       OUT (C),E        AF=0100 BC=00BF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  3460
[00B1B9] 71b9 ED 51       OUT (C),D        AF=0100 BC=00BF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  3460
[00B1BB] 71bb FB          EI               AF=0100 BC=00BF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200

; ------------------------------------------------------------

; Load method byte

[00B1BC] 71bc 4E          LD C,(HL)        AF=0100 BC=00BF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200
[00B1BD] 71bd 23          INC HL           AF=0100 BC=00FF DE=4200 HL=A3EF SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200

; 8-bits of decoding

[00B1BE] 71be 06 08       LD B,08h         AF=0100 BC=00FF DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200

; Examine next bit

[00B1C0] 71c0 CB 19       RR C             AF=0100 BC=08FF DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200

; 0 --> LZ
; 1 --> Raw

[00B1C2] 71c2 30 09       JR NC,71CDh      AF=0129 BC=087F DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200

; --------------------------------------------------------

; Raw byte copy

[00B1C4] 71c4 7E          LD A,(HL)        AF=0129 BC=087F DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200
[00B1C5] 71c5 D3 BE       OUT (BEh),A      AF=3C29 BC=087F DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0200
[00B1C7] 71c7 23          INC HL           AF=3C29 BC=087F DE=4200 HL=A3F0 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0201
[00B1C8] 71c8 13          INC DE           AF=3C29 BC=087F DE=4200 HL=A3F1 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0201

; Continue using current barrel

[00B1C9] 71c9 10 F5       DJNZ 71C0h       AF=3C29 BC=087F DE=4201 HL=A3F1 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0201

; Reload method barrel

[00B1CB] 71cb 18 EF       JR 71BCh         AF=3CA9 BC=00FE DE=4208 HL=A3F8 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0208

; --------------------------------------------------------

[00B1CD] 71cd C5          PUSH BC          AF=66A8 BC=08BC DE=4218 HL=A40B SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Read parameters

[00B1CE] 71ce 4E          LD C,(HL)        AF=66A8 BC=08BC DE=4218 HL=A40B SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1CF] 71cf 23          INC HL           AF=66A8 BC=08EC DE=4218 HL=A40B SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1D0] 71d0 46          LD B,(HL)        AF=66A8 BC=08EC DE=4218 HL=A40C SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1D1] 71d1 23          INC HL           AF=66A8 BC=1FEC DE=4218 HL=A40C SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; NIL = Stop

[00B1D2] 71d2 79          LD A,C           AF=66A8 BC=1FEC DE=4218 HL=A40D SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1D3] 71d3 B0          OR B             AF=ECA8 BC=1FEC DE=4218 HL=A40D SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1D4] 71d4 28 31       JR Z,7207h       AF=FFAC BC=1FEC DE=4218 HL=A40D SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

[00B1D6] 71d6 E5          PUSH HL          AF=FFAC BC=1FEC DE=4218 HL=A40D SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Lower 4-bits = lower 4-bits (B) + 8-bit (C) delta pointer

[00B1D7] 71d7 78          LD A,B           AF=FFAC BC=1FEC DE=4218 HL=A40D SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1D8] 71d8 F6 F0       OR F0h           AF=1FAC BC=1FEC DE=4218 HL=A40D SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Compute window cursor

[00B1DA] 71da 67          LD H,A           AF=FFAC BC=1FEC DE=4218 HL=A40D SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1DB] 71db 69          LD L,C           AF=FFAC BC=1FEC DE=4218 HL=FF0D SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1DC] 71dc 19          ADD HL,DE        AF=FFAC BC=1FEC DE=4218 HL=FFEC SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1DD] 71dd CB B4       RES 6,H          AF=FF95 BC=1FEC DE=4218 HL=4204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Upper 4-bits + $03 = run count

[00B1DF] 71df 78          LD A,B           AF=FF95 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E0] 71e0 E6 F0       AND F0h          AF=1F95 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E2] 71e2 0F          RRCA             AF=1010 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E3] 71e3 0F          RRCA             AF=0800 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E4] 71e4 0F          RRCA             AF=0408 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E5] 71e5 0F          RRCA             AF=0200 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E6] 71e6 C6 03       ADD A,03h        AF=0100 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Setup VRAM

[00B1E8] 71e8 47          LD B,A           AF=0400 BC=1FEC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1E9] 71e9 0E BF       LD C,BFh         AF=0400 BC=04EC DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218

; Perform LZ per-byte basis

[00B1EB] 71eb F3          DI               AF=0400 BC=04BF DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1EC] 71ec ED 69       OUT (C),L        AF=0400 BC=04BF DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1EE] 71ee ED 61       OUT (C),H        AF=0400 BC=04BF DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1F0] 71f0 23          INC HL           AF=0400 BC=04BF DE=4218 HL=0204 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0205

; VDP delay

[00B1F1] 71f1 E5          PUSH HL          AF=0400 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0205
[00B1F2] 71f2 E1          POP HL           AF=0400 BC=04BF DE=4218 HL=0205 SP=DFE2 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0205

; Read from VRAM

[00B1F3] 71f3 DB BE       IN A,(BEh)       AF=0400 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0205
[00B1F5] 71f5 E5          PUSH HL          AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0206
[00B1F6] 71f6 E1          POP HL           AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE2 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0206

; Write to VRAM

[00B1F7] 71f7 ED 59       OUT (C),E        AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0206
[00B1F9] 71f9 ED 51       OUT (C),D        AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0206
[00B1FB] 71fb D3 BE       OUT (BEh),A      AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0218
[00B1FD] 71fd FB          EI               AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0219

[00B1FE] 71fe 13          INC DE           AF=5A00 BC=04BF DE=4218 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0219
[00B1FF] 71ff 10 EA       DJNZ 71EBh       AF=5A00 BC=04BF DE=4219 HL=0205 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  0219

[00B201] 7201 E1          POP HL           AF=3C00 BC=00BF DE=421C HL=0208 SP=DFE4 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  021C
[00B202] 7202 C1          POP BC           AF=3C00 BC=00BF DE=421C HL=A40D SP=DFE6 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  021C

; Check barrel status

[00B203] 7203 10 BB       DJNZ 71C0h       AF=3C00 BC=08BC DE=421C HL=A40D SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  021C
[00B205] 7205 18 B5       JR 71BCh         AF=4200 BC=00F1 DE=422C HL=A417 SP=DFE8 IX=C280 IY=C2B0 B    P0=00000 P1=08000 P2=4C000 [ROM]  022C

; Terminate

[00B207] 7207 C1          POP BC           AF=0044 BC=0000 DE=4480 HL=A587 SP=DFE6 IX=C280 IY=C2B0 OVB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
[00B208] 7208 C9          RET              AF=0044 BC=0880 DE=4480 HL=A587 SP=DFE8 IX=C280 IY=C2B0 OVB   P0=00000 P1=08000 P2=4C000 [ROM]  0480
